package com.lovemanai.tools.servlet;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lovemanai.tools.filter.GetRequest;


/**
 * 作用：用于所有Servlet的父类，实现在一个Servlet中进行多个请求处理
 * 原理：
 * 1.获取method参数，method为用户想调用的方法
 * 2.将方法名转换成Method实例对象
 * 3.通过invoke()调用这个方法
 * 使用方法：
 * 0.在web.xml中配置
 * 指定字符编码
 * 	<context-param>
 *		<param-name>characterEncoding</param-name>
 *		<param-value>UTF-8</param-value>
 *	</context-param>
 * 1.让Servlet中继承BaseSevlet
 * 2.在Servlet中写业务方法。
 * 	格式：
		public String login(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException{
				System.out.println("AServlet.login()");
				return "f:/index.jsp";
		}
 * 返回值必须是String，参数为HttpServletRequest和HttpServletResp对象，throws ServletException, IOException
 * 返回值为跳转的页面或者Servlet，f前缀表示请求转发，r表示重定向
 * 3.调用Servlet时必须有参数method，method为Servlet中的方法名
 * @author lovemanai
 *
 */
public class BaseServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String charset = this.getServletContext().getInitParameter("characterEncoding");
		if(request.getMethod().equalsIgnoreCase("get")) {//将get请求的request对象进行处理
			request = new GetRequest(request, charset);	
		} else {
			request.setCharacterEncoding(charset);
		}
		response.setContentType("text/html;charset=utf-8");
		
		/*
		 * 1.获取method参数，method为用户想调用的方法
		 */
		
		String methodName = request.getParameter("method");
		Method method = null;
		
		/*
		 * 2.将方法名转换成Method实例对象
		 */
		
		try {
			method = this.getClass().getMethod(methodName,HttpServletRequest.class, HttpServletResponse.class);
		} catch (Exception e) {
			throw new RuntimeException("您调用的方法：" + methodName +"不存在",e);
		}
		
		/*
		 * 3.通过invoke()调用这个方法
		 */
		
		try {
			String result = method.invoke(this, request, response).toString();
			if(result != null && !result.trim().isEmpty()) {//如果请求处理方法返回不为空
				int index = result.indexOf(":");//获取第一个冒号的位置
				if(index == -1) {//如果不存在冒号，使用请求转发
					request.getRequestDispatcher(result).forward(request, response); 
				} else { //如果存在冒号
					String pre = result.substring(0, index);//前缀
					String path = result.substring(index + 1);//路径
					if(pre.equalsIgnoreCase("f")) { //f表示转发
						request.getRequestDispatcher(path).forward(request, response);
					} else if(pre.equalsIgnoreCase("r")) { //r表示重定向
						response.sendRedirect(request.getContextPath() + path);
					}
				}
				
			}
		} catch (Exception e) {
			throw new RuntimeException(e); 
		}
		
	}


}
